const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const {readJSONFileSync} = require('./readfile_model.js')
const {compileFile} = require('./compile_file')


/**
 * 生成指定大小和类型的文件
 * @param {string} filePath 文件路径
 * @param {number} size 文件大小（字节）
 * @param {string} type 文件类型（'text'、'binary'）
 */
function createFile(filePath, fileContent) {

    // 生成随机数据
    let data = '';
    let size = 2048;
    let type = 'text';
    let fileContentText = `
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
        </head>
        <body>
            <span>fileSize:${size}</span>
            <span>fileType:${type}</span>
        </body>
        </html>
    `
    if (type === 'text') {
        data = crypto.randomBytes(size).toString('utf8');
    } else if (type === 'binary') {
        data = crypto.randomBytes(size);
    }

    // 写入文件
    return fs.writeFileSync(filePath, fileContent);

    // return console.log('创建了文件')

    // 使用 Node.js 的 path 模块的 join() 方法将多个路径片段拼接成一个完整的路径。
    // console.log('__dirname',__dirname)
    // const fileFullPath = path.join(__dirname, filePath);
    //
    // // 使用 fs 模块的 writeFile() 方法创建文件，并写入内容。
    // fs.writeFile(fileFullPath, fileContent, (err) => {
    //     if (err) {
    //         console.error(err);
    //     } else {
    //         console.log(`文件 ${filePath} 创建成功！`);
    //     }
    // });
}

/**
 * @param folderPath {String} 同步读取配置文件
 */
function getFilesInFolder(folderPath) {
    return new Promise((resolve, reject) => {
        fs.readdir(folderPath, (err, files) => {
            if (err) {
                reject(err);
                return;
            }

            resolve(files);
        });
    });
}

async function  buildFile(){
    //获取配置文件
    const filePath = path.resolve(__dirname,'../toolConfig.json');
    let toolConfig = readJSONFileSync(filePath);

    //获取构造文件
    const files = await getFilesInFolder(toolConfig.configSrc);
    console.log('files:',files)
    let configDataList = []
    for (const fileName of files) {
        const fileSrc = path.resolve(__dirname,'../',toolConfig.configSrc,fileName);
        // console.log("fileName:",fileSrc)
        let configData = null;
        try{
            if ( 'json' == fileName.split(".").pop()){
                configData = readJSONFileSync(fileSrc);
            }
        }catch (err){
            console.log(`${fileName}文件格式解析错误，请检查json文件是否合法，错误新消息:\n`,err)
        }
        // console.log("configData:",configData)
        let fileFro = fileName.split(".")
        fileFro.pop();
        let obj = {
            "fileName": fileFro.join(''),
            "configData": configData
        }
        if(null != configData) configDataList.push(obj)
    }
    // console.log('configDataList',configDataList)
    // console.log('process',process)
    for (let fileItem of configDataList) {
        try {
            await fs.promises.stat(toolConfig.froAbsoluteSrc);
        } catch (e) {
            // {recursive: true} 这个配置项是配置自动创建多层文件夹
            await fs.promises.mkdir(toolConfig.froAbsoluteSrc, { recursive: true });
        }
        const templateName =  path.resolve(toolConfig.froAbsoluteSrc,fileItem.fileName+'.vue')
        const template = compileFile(fileItem);
        createFile(templateName, template);
    }
    let time =  new Date()
    console.log(time)
    console.log(".....................build over!......................")

}

module.exports =  buildFile;
